package cn.org.xuanguang.kepler.hormos.spring.starter;

import javax.sql.DataSource;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * 动态数据源管理,当前的数据源id生成有问题，一种类型的数据源，只能注册一个，后期需要改成根据自定义id来生成
 *
 * @since 1.0
 */
public class HormosDataSourceManager {
    /**
     * 数据源列表
     */
    private static ConcurrentMap<String, DataSource> hormosDataSourceMap = new ConcurrentHashMap<>();


    /**
     * 向Hormos数据源映射中添加一个新的数据源实例。
     * 当数据源的类名作为键存在映射中时，会用新的数据源实例覆盖之前的实例。
     *
     * @param dsId       dsId
     * @param dataSource 需要添加到映射中的数据源实例。
     */
    public static void addDataSource(String dsId, DataSource dataSource) {
        // 使用compute方法将新的dataSource实例添加到hormosDataSourceMap中，
        // 如果键已存在，则用新的dataSource实例替换旧的。
        hormosDataSourceMap.compute(getDataSourceId(dsId), (k, v) -> dataSource);
    }

    /**
     * 根据数据源ID获取数据源。
     *
     * @param dataSourceId 数据源的唯一标识符。
     * @return 返回与给定ID匹配的DataSource对象。如果找不到对应的DataSource，则抛出运行时异常。
     */
    public static DataSource getDataSource(String dataSourceId) {
        // 通过数据源ID从映射中获取数据源，如果不存在，则抛出运行时异常
        return Optional.ofNullable(hormosDataSourceMap.get(dataSourceId)).orElseThrow(() -> new RuntimeException("未找到数据源"));
    }

    /**
     * 从hormosDataSourceMap中移除指定的dataSource。
     *
     * @param dataSourceId 要移除的数据源的ID。
     */
    public static void removeDataSource(String dataSourceId) {
        hormosDataSourceMap.remove(dataSourceId); // 从映射中移除指定ID的数据源
    }

    /**
     * 获取给定数据源的ID。
     * 该方法通过查找与数据源类名对应的数据源映射，来获取数据源的ID。如果找不到对应的映射，则抛出运行时异常。
     *
     * @param dataSourceId 需要获取ID的数据源对象。
     * @return 数据源的ID，作为字符串返回。
     * @throws RuntimeException 如果无法找到对应的数据源ID，抛出此异常。
     */
    public static String getDataSourceId(String dataSourceId) {
        // 通过数据源的类名在映射中查找数据源，然后获取其类名作为ID
        return dataSourceId;
    }


}
